# -*- coding: utf-8 -*-

"""
  @author: tangliqi
  @date: 2022/9/18 16:42
  @python version: 3.6 
  
  ---------------------------------------
  @desc: python设计模式实现 => 静态代理模式.py
"""
from abc import ABC, abstractmethod


# 代理模式主要由三部分构成：
# * 原始类（被代理类）
# * 抽象类（实现跟原始类一样的接口）
# * 代理类（实现抽象类）

# 通过一个找中介租房的例子，中介和房东都实现了出租房的接口，租房者作为客户端，调用租房方法。
# 中介作为代理类，实现帮房东出租房的同时，收取中介费（增加功能）,判断房屋是否可以合法出租,并且不影响原有功能
# 房东作为原始类（被代理类）
# 抽象类（统一中介和房东的接口）

# ============================  抽象类  ============================
class IRentHouse(ABC):
    @abstractmethod
    def rent_house(self):
        """
        出租房屋
        """
        pass


# ============================  房东类  ============================
class RentHouse(IRentHouse):
    def rent_house(self):
        print("我是房东，要出租房子")


# ============================  中介类（代理类）  ============================
class Proxy(IRentHouse):
    def __init__(self):
        self.real_object = rent_obj

    def check_house(self):
        print("检查房子是否合法")

    def get_pay(self):
        print("获取中介费")

    def rent_house(self):
        """
        实现租房功能的基础上，提供附加功能
        """
        # 检查房子是否合法
        self.check_house()

        # 实现租房功能
        self.real_object().rent_house()

        # 收取中介费
        self.get_pay()


if __name__ == "__main__":
    # 直接租房者与房东沟通，可能存在风险
    RentHouse().rent_house()

    # 通过中介，实现租房者租房，房东出租房
    rent_obj = RentHouse
    Proxy(rent_obj).rent_house()
